博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel之认证服务
阅读量:6418 次
发布时间:2019-06-23

本文共 7696 字,大约阅读时间需要 25 分钟。

一.用户认证配置文件在config/auth.php下1.添加认证路由// 认证路由...Route::get('auth/login', 'Auth\AuthController@getLogin');Route::post('auth/login', 'Auth\AuthController@postLogin');Route::get('auth/logout', 'Auth\AuthController@getLogout');// 注册路由...Route::get('auth/register', 'Auth\AuthController@getRegister');Route::post('auth/register', 'Auth\AuthController@postRegister');2.视图a.登录表单
@if(count($errors)>0) @foreach($errors->all() as $value) {
{$value}} @endforeach@endif
{!! csrf_field() !!}
Email
Password
Remember Me
b.注册表单
{!! csrf_field() !!}
Name
Email
Password
Confirm Password
3.认证a.在App/Http/Controllors/Auth的AuthController.php,按需修改以下参数protected $redirectPath = '/dashboard';//登录成功后的重定向protected $loginPath = '/login';//登录失败后的重定向b.自定义字段要修改新用户注册所必需的表单字段,或者自定义新用户字段如何存储到数据库,你可以修改AuthController类。该类负责为应用验证和创建新用户。AuthController 的validator 方法包含了新用户的验证规则,你可以随意按需要自定义该方法。AuthController 的create 方法负责使用Eloquent ORM 在数据库中创建新的App\User 记录。你可以基于自己的需要随意自定义该方法。4.获取认证用户$user = Auth::user();如:class ProfileController extends Controller{ /** * 更新用户属性. * * @param Request $request * @return Response */ public function updateProfile(Request $request) { if ($request->user()) { // $request->user() 返回认证用户实例... } }}5.判断当前用户是否有认证if (Auth::check()) { // The user is logged in...}6.使用中间件// 使用路由闭包...Route::get('profile', ['middleware' => 'auth', function() { // 只有认证用户可以进入...}]);// 使用控制器...Route::get('profile', [ 'middleware' => 'auth', 'uses' => 'ProfileController@show']);或者在控制器中public function __construct(){ $this->middleware('auth');}7.登录失败次数限制如果你正在使用 Laravel 内置的AuthController 类, Illuminate\Foundation\Auth\ThrottlesLogins trait可以用于限制用户登录失败次数。默认情况下,用户在几次登录失败后将在一分钟内不能登录,这种限制基于用户的用户名/邮箱地址+IP 地址:
$email, 'password' => $password], $remember)){...} *if (Auth::viaRemember()) {//} *可以使用viaRemember 方法来判断用户是否使用“记住我”cookie 进行认证 *使用自动认证的记住我功能,需要生成一下key,执行php artisan key:generate */ if (Auth::attempt(['email' => $email, 'password' => $password])) { // 认证通过... return redirect()->intended('dashboard'); } }}attempt 方法接收键值数组对作为第一个参数,数组中的值被用于从数据表中查找用户,因此,在上面的例子中,用户将会通过email 的值获取,如果用户被找到,经哈希运算后存储在数据中的密码将会和传递过来的经哈希运算处理的密码值进行比较。如果两个经哈希运算的密码相匹配那么一个认证 session 将会为这个用户开启。如果认证成功的话attempt 方法将会返回true 。否则,返回 false。 重定向器上的intended 方法将会将用户重定向到登录之前用户想要访问的 URL,在目标 URL 无效的情况下备用 URI 将会传递给该方法。 如果你想的话,除了用户邮件和密码之外还可以在认证查询时添加额外的条件,例如,我们可以验证被标记为有效的用户:if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) { // The user is active, not suspended, and exists.}退出:Auth::logout();//这将清除掉session信息9.用用户名登录,不用email登录Laravel5.1默认使用email来验证登录的,可以在AuthController中设置$username属性来指定登录账号选项,该属性默认值是emailprotected $username = 'name';10.其他认证方法:Auth::login($user);//认证一个用户实例Auth::loginUsingId(1);//通过id认证一次性认证用户:可以使用 once 方法只在单个请求中将用户登录到应用,而不存储任何 session 和 cookie,这在构建无状态的 API 时很有用。once 方法和 attempt 方法用法差不多:if (Auth::once($credentials)) { //}二.重置密码1.迁移数据库php artisan migrate2.路由// 密码重置链接请求路由...Route::get('password/email', 'Auth\PasswordController@getEmail');Route::post('password/email', 'Auth\PasswordController@postEmail');// 密码重置路由...Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');Route::post('password/reset', 'Auth\PasswordController@postReset');3.视图重置密码,填写邮箱页面
{!! csrf_field() !!}
Email
点击发送邮件页面
Click here to reset your password: {
{ url('password/reset/'.$token) }}4.密码重置表单页面当用户点击电子邮件中的链接来重置密码时,需要提交一个密码重置表单,该视图位于resources/views/auth/reset.blade.php 。 下面是一个密码重置表单示例:
{!! csrf_field() !!}
5.重置密码后如果你已经定义好路由和视图来重置用户密码,只需要在浏览器中访问这些路由即可。框架自带的PasswordController 已经包含了发送密码重置链接邮件以及更新数据库中密码的逻辑。 密码被重置后,用户将会自动登录到应用并重定向到/home 。你可以通过定义上PasswordController 的redirectTo 属性来自定义post 密码重置跳转链接:protected $redirectTo = '/dashboard';注意:默认情况下,密码重置令牌一小时内有效,你可以通过修改config/auth.php 文件中的选项reminder.expire 来改变有效时间。三.通过Gate检查权限1.当前用户权限检查用户删除某篇文章时,判断该文章是否有权限,即自己发布的,可以删除,否则不能删除在Auth服务提供者中定义:
define('update-post', function ($user, $post) { return $user->id === $post->user_id; }); }}注意我们并没有检查给定$user 是否为 NULL,当用户未经过登录认证或者用户没有通过forUser 方法指定,Gate 会自动为所有权限返回 false。基于类的权限 除了注册授权回调闭包之外,还可以通过传递包含权限类名和类方法的方式来注册权限方法,当需要的时候,该类会通过服务容器进行解析:$gate->define('update-post', 'PostPolicy@update');使用:class PostController extends Controller{ /** * 更新给定文章 * * @param int $id * @return Response */ public function update($id) { $post = Post::findOrFail($id); if (Gate::denies('update-post', $post)) { abort(403); } } // 更新文章...}当然, allows 方法和 denies 方法是相对的,如果动作被授权会返回 true ,check 方法是 allows 方法的别名。2.为指定的用户检查权限为指定用户检查权限 如果你想要使用 Gate 门面判断非当前用户是否有权限,可以使用 forUser 方法:if (Gate::forUser($user)->allows('update-post', $post)) { //}也可以传递多个参数Gate::define('delete-comment', function ($user, $post, $comment) { //});或者传入数组if (Gate::allows('delete-comment', [$post, $comment])) { //}四.通过User检查权限1.控制器中检查
user()->cannot('update-post', $post)) { abort(403); } // 更新文章... }}当然, can 方法和cannot 方法相反if ($request->user()->can('update-post', $post)) { // 更新文章...}2.模板中检查Laravel 提供了 Blade 指令@can 来快速检查当前用户是否有指定权限View Post@can('update-post', $post) Edit Post@endcan可以将@can 指令和@else 指令联合起来使用@can('update-post', $post)
@else
@endcan3.表单请求中检查可以选择在表单请求的authorize 方法中使用Gate 定义的权限/*** 判断请求用户是否经过授权** @return bool*/public function authorize(){ $postId = $this->route('post'); return Gate::allows('update', Post::findOrFail($postId));}五.策略类由于在AuthServiceProvider 中定义所有的授权逻辑将会变得越来越臃肿笨重,尤其是在大型应用中,所以 Laravel 允许你将授权逻辑分割到多个“策略”类中,策略类是原生的 PHP 类,基于授权资源对授权逻辑进行分组。1.生成命令生成一个策略类php artisan make:policy PostPolicy生成的策略PostPolicy位于app/Policies目录下2.映射策略类
PostPolicy::class, ];}3.编写策略(PostPolicy.php)
id === $post->user_id; }}你可以继续在策略类中为授权的权限定义更多需要的方法,例如,你可以定义show , destroy , 或者addComment 方法来认证多个Post 动作。 注意:所有策略类都通过服务容器进行解析,这意味着你可以在策略类的构造函数中类型提示任何依赖,它们将会自动被注入。4.检查策略(使用)通过 User 模型 User 模型的 can 和 cannot 方法将会自动使用给定参数中有效的策略类。这些方法提供了便利的方式来为应用接收到的任意User 实例进行授权1.控制器中Gatepublic function update($id){ $post = Post::findOrFail($id); if (Gate::denies('update', $post)) { abort(403); } // 更新文章...}2.通过 User 模型 User 模型的 can 和 cannot 方法将会自动使用给定参数中有效的策略类。这些方法提供了便利的方式来为应用接收到的任意User 实例进行授权if ($user->can('update', $post)) { //}if ($user->cannot('update', $post)) { //}模板中@can('update', $post)
@endcan3.通过帮助函数if (policy($post)->update($user, $post)) { //}六.控制器授权1.手动判断默认情况下,Laravel自带的控制器基类App\Http\Controllers\Controller使用了AuthorizesRequeststrait,该trait提供了可用于快速授权给定动作的authorize方法,如果授权不通过,则抛出HttpException异常。该authorize方法和其他多种授权方法使用方法一致,例如Gate::allows和$user->can()。因此,我们可以这样使用authorize方法快速授权更新Post的请求:
authorize('update', $post); // 更新文章... }}如果授权成功,控制器继续正常执行;然而,如果authorize方法判断该动作授权失败,将会抛出HttpException 异常并生成带403 Not Authorized状态码的HTTP响应。正如你所看到的,authorize方法是一个授权动作、抛出异常的便捷方法。AuthorizesRequeststrait还提供了authorizeForUser方法用于授权非当前用户:$this->authorizeForUser($user, 'update', $post);2.自动判断通常,一个策略类方法对应一个控制器上的方法,例如,在上面的update方法中,控制器方法和策略类方法共享同一个方法名:update。正是因为这个原因,Laravel允许你简单传递实例参数到authorize方法,被授权的权限将会自动基于调用的方法名进行判断。在本例中,由于authorize在控制器的update方法中被调用,那么对应的,PostPolicy上update方法将会被调用:/** * 更新给定文章 * * @param int $id * @return Response */public function update($id){ $post = Post::findOrFail($id); $this->authorize($post); // 更新文章...}

  

转载于:https://www.cnblogs.com/itfenqing/p/6930440.html

你可能感兴趣的文章
新手指南:在 Ubuntu 和 Fedora 上安装软件包
查看>>
在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器
查看>>
《Python高性能编程》——2.2 Julia集合的介绍
查看>>
大型网站的 HTTPS 实践(二):HTTPS 对性能的影响
查看>>
《Swift 权威指南》——第6章,第6.10节嵌套函数
查看>>
《自己动手做交互系统》——1.3 本章小结
查看>>
Mobile devices bundled with malware?
查看>>
《JavaScript面向对象精要》——1.5 访问属性
查看>>
《Python数据可视化编程实战》—— 第 1 章 准备工作环境
查看>>
Android应用性能优化最佳实践.1.1 Android Studio的优势
查看>>
《设计模式解析(第2版•修订版)》—第2章 2.2节什么是UML
查看>>
【健康医疗】4步完成数据分析报表,让医疗数据转化为生产力
查看>>
【直播】APP全量混淆和瘦身技术揭秘
查看>>
10个大坑,当你产品上架AppStore会遇到
查看>>
【shell 脚本】两种登录方式
查看>>
学习编程的方法
查看>>
升级linux自带的Python
查看>>
百度地图2.0瓦片地址获取(窗口内瓦片)
查看>>
我的友情链接
查看>>
.JDK1.6安装配置后的测试
查看>>